 /* 
 * File:   cPhysicalObject.h
 * Author: josep
 *
 * Created on 14 / desembre / 2010, 03:05
 */

#include "cPositionedObject.h"
#include "cPhysicalReaction.h"

#ifndef CPHYSICALOBJECT_H
#define	CPHYSICALOBJECT_H

class cPhysics;

class cPhysicalObject: public cPositionedObject {
public:
    cPhysicalObject();
    cPhysicalObject(const cPhysicalObject& orig);
    virtual ~cPhysicalObject();
    virtual void NextStep(int time);
    virtual bool isDead(){return true;}


    /* Impidide el avance físico del objeto en la dirección horizontal i pone
     * la componente de las abcisas de la velocidad a cero.
     */
    void StopX(int PosX);
    /* Impide el avance físico del objeto en la dirección vertical i pone 
     * la componente de las ordenadas de la velocidad a cero.
     */
    void StopY(int PosY);

    /* Impide el avance físico del objeto en qualquier dirección i pone 
     * la velocidad a cero.
     */
    void Stop(int PosX, int PosY);
    
    /*indica si el objeto se encuentra en el aire o por el contrario esta tocando 
     * el  suelo. Este indicador se actualiza automàticament en cada iteración
     */
    bool IsInTheAir() const;

    /* La posición del objeto se mantiene como valor decimal, aunque normalmente
     * se trabaje como si fuera un entero tal como devuelve la función GetPosX o
     * GetPosY. Las funciones GetExactPosX i GetExactPosY permiten obtener el valor
     * decimal de la posición del objeto.
     */
    float GetExactPosX();
    float GetExactPosY();

    /* Incrementa la posición
     */
    void IncPosX(float inc);
    void IncPosY(float inc);

    /* Incrementa la velocidad
     */
    void IncSpeedX(float inc);
    void IncSpeedY(float inc);

    void SetMaxForceFactor(int Dir, float MaxForceFactor);
    float GetMaxForceFactor(int Dir) const;
    void IncForceFactor(int Dir, float forceFactor);
    void SetForceFactor(int Dir, float forceFactor);
    float GetForceFactor(int Dir) const;
    float GetFrictionFactor() const;
    void SetAccelerationUnit(int Dir, float Acceleration);
    float GetAccelerationUnit(int Dir);
    int GetSurfaceType(int surfaceId);
    const int* GetSurfaceType();
    void SetSurfaceType(int surfaceId, int SurfaceType);
protected:
    virtual void SetInTheAir(bool inTheAir);
    virtual void Notify(cPhysicalReaction* reaction);
    bool inTheAir;

    void SetFrictionFactor(float FrictionFactor);
private:
    friend class cPhysics;
    float forceFactor[2];
    float MaxForceFactor[2];
    float FrictionFactor;
    float AccelerationUnit[2];
    int SurfaceType[4];
};

#endif	/* CPHYSICALOBJECT_H */

